<?php
class PluginsManagerController extends AppController {
	var $name = 'PluginsManager';
	var $uses = array();
	var $view = "Theme";
	var $theme = 'tcx_plugins';
	var $layout = 'default';
	var $registryFile = "installed.xml";
	
	function beforeFilter() {
		parent::beforeFilter();
		App::import('Xml');
		$this->registryFile = ROOT . DS . APP_DIR . DS . "plugins" . DS . $this->registryFile; 
	}
	function index() {
		$pluginPaths = App::path('plugins');
		$registryFile = $this->registryFile; 
		
		$xmlObj = & new XML($registryFile);
	    $installedPlugins = Set::reverse($xmlObj);
	    
	    if (!isset($installedPlugins['Plugins']) && isset($installedPlugins['plugins'])) {
	    	$installedPlugins['Plugins'] = $installedPlugins['plugins'];
	    }
	    
	    // Cleanup
	    $allPlugins = App::objects('plugin');
	    foreach ($installedPlugins['Plugins'] as $plugin => $property) {
	    	if (!in_array($plugin, $allPlugins)) {
	    		unset($installedPlugins['Plugins'][$plugin]);
	    	}
	    }
		// Xây dựng danh sách các plugin hợp lệ
		$notInstalledPlugins = array();
		foreach ($pluginPaths as $path) {
			$fdHandle = opendir($path);
			while ($dir = readdir($fdHandle)) {
				if (file_exists($path . $dir . DS . "install/meta.xml")) {
					$setupInfoXml = & new XML($path . $dir . DS . "install/meta.xml");
	    			$setupInfo = Set::reverse($setupInfoXml);
	    			
	    			list ($plugin, $properties) = each ($setupInfo);
	    			if (!empty($properties) && !isset($installedPlugins['Plugins'][$plugin])) {
						$notInstalledPlugins[$plugin] = $properties;
	    			}
				}
			}
		}
		//debug($notInstalledPlugins);exit;
		$this->set(compact('notInstalledPlugins', 'installedPlugins'));
	}
	
	function install($dir) {
		// bổ sung thông tin vào file installed.xml
		$pluginPaths = App::path('plugins');
		$installerInfo = array();
		$plugin = "";
		$installerInfo = array();
		$properties = array();
		$pluginPath = "";
		foreach ($pluginPaths as $path) {
			$metaFile = $path . $dir . DS . "install/meta.xml";
			
			// Nếu file meta.xml tồn tại thì mới tiếp tục
			if (file_exists($metaFile)) {
				// Đọc thông tin file
				$xmlInfo = new XML($metaFile);
				$info = Set::reverse($xmlInfo);
				list($plugin, $properties) = each($info);
				$installerInfo = $properties['Installer'];
				$pluginPath = $path . $dir;

				// Xử lý thông tin của plugin
				$doc = new DOMDocument();
				$doc->load($metaFile);
				$xpath = new DOMXPath($doc);
				
				$domPlugin = $doc->documentElement;
				
		        // Đưa vào trong file installed.xml
		        $domInstalled = new DomDocument();
		        $domInstalled->load($this->registryFile);
		        $domPlugins = $domInstalled->documentElement;
		        
		        // Kiểm tra xem plugin đã tồn tại chưa
		        $xpath = new DOMXPath($domInstalled);
		        $query = $plugin;
		        $installedPlugins = $xpath->query($query);
		        // Nếu chưa tồn tại mới add vào
		        
		        if (!$installedPlugins->length) {
		        	$newNode = $domInstalled->importNode($domPlugin, true);
		        	$domPlugins->appendChild($newNode);
		        	// save path
		        	$paths = $xpath->query("{$plugin}/path");
		        	$paths->item(0)->appendChild($domInstalled->createTextNode($pluginPath));
		        	
		        	$domInstalled->save($this->registryFile);
		        } else { // Ngược lại, sẽ báo lỗi là đã tồn tại
		        	$this->Session->setFlash(__("Plugin đã tồn tại. Bạn vui lòng kiểm tra lại", true), "flash_error");
		        	$this->redirect(array('action' => 'index'));
		        }
		        
				// thực thi câu lệnh sql nếu có
				App::import('Lib', 'SqlImport');
				$SqlImPort = new SQLImport();
				mysql_query("SET FOREIGN_KEY_CHECKS = OFF;");
				foreach ($installerInfo['SqlFiles'] as $sqlFile) {
					if (is_array($sqlFile)) {
						foreach ($sqlFile as $file) {
							if ($file != "uninstall.sql") {
								$queries = $SqlImPort->splitQueryText($pluginPath . DS . "install/sql" . DS . $file);
								foreach ($queries as $query) {
									mysql_query($query);
								}
							}
						}
					} else {
						if ($sqlFile != "uninstall.sql") {
							$queries = $SqlImPort->splitQueryText($pluginPath . DS . "install/sql" . DS . $sqlFile);
							foreach ($queries as $query) {
								mysql_query($query);
							}
						}
					}
				}
				
				// Tạo menu nếu có
				$this->Menu->createPluginMenu();
				
				// Copy file & thư mục nếu có
				$root = $pluginPath . DS . "install/app";
				$fd = new Folder();
				if (($fd->cd($root)) !== false) {
					$appRoot = ROOT . DS . APP_DIR;
					$fd->copy($appRoot);
				}

    			continue;
			}
		}
		
		
		// Báo thành công
		$this->Session->setFlash(__("Plugin {$plugin} đã được cài đặt thành công", true), "flash_success");
		$this->redirect(array('action' => 'index'));
	}
	
	function uninstall($plugin) {
		// Tháo bỏ những thứ liên quan
        $domInstalled = new DomDocument();
        $domInstalled->load($this->registryFile);
        $domPlugins = $domInstalled->documentElement;
        
        // Kiểm tra xem plugin đã tồn tại chưa
        $xpath = new DOMXPath($domInstalled);
        $query = $plugin;
        $installedPlugins = $xpath->query($query);
        
        // Nếu tồn tại mới tiến hành xóa
        if ($installedPlugins->length) {
        	for ($i = 0; $i < $installedPlugins->length; $i++) {
        		$node = $installedPlugins->item($i);
        		
        		App::import('XML');
        		$xmlObj = new XML($this->registryFile);
        		$arrInstalledPlugins = Set::reverse($xmlObj);
        		$uninstallInfo = $arrInstalledPlugins['Plugins'][$plugin]['Installer'];
        		//debug($uninstallInfo);exit;
        		
        		// Tháo gỡ sql
        		$uninstallSql = $arrInstalledPlugins['Plugins'][$plugin]['path'] . DS . "install/sql/uninstall.sql";
        		if (file_exists($uninstallSql)) {
	        		App::import('Lib', 'SqlImport');
					$SqlImPort = new SQLImport();
					$queries = $SqlImPort->splitQueryText($uninstallSql);
					mysql_query("SET FOREIGN_KEY_CHECKS = OFF;");
					foreach ($queries as $query) {
						mysql_query($query);
					}
        		}
        		// Xóa các thư mục liên quan
        		// TODO: Xóa các thư mục liên quan
        		
        		// Xóa item trong menu
        		$domPlugins->removeChild($node);
        	}
        	
        	$domInstalled->save($this->registryFile);
        	$this->Menu->createPluginMenu();
        	
        	// Thông báo thành công
        	$this->Session->setFlash(__("Plugin {$plugin} đã được tháo gỡ thành công", true), "flash_success");
        	$this->redirect(array('action' => 'index'));
        } else { // Ngược lại, sẽ báo lỗi là không tồn tại
        	$this->Session->setFlash(__("Plugin chưa hề tồn tại. Bạn vui lòng kiểm tra lại", true), "flash_error");
        	$this->redirect(array('action' => 'index'));
        }
		// Xóa thông tin trong file installed.xml
	}
}